}
}
-
+// There is no test coverage of this and it's been wrong for years and
+// nobody has noticed...
static int
-unicsv_parse_gc_id(const char* str)
+unicsv_parse_gc_id(const QString& str)
{
int res = 0;
-
- if (str && (str[0] == 'G') && (str[1] == 'C')) {
- int base;
- char cx;
-
- str += 2;
- if (strlen(str) > 4) {
- base = 31;
- } else {
- base = (*str < 'G') ? 16 : 31;
- }
- // FIXME: this is wrong. 0123456789ABCDEFGHJKMNPQRTVWXYZ ILOSU are omitted.
- // That nobody has noticed is a good hint nobody cares...
- while ((cx = *str++)) {
- int num;
-
- if ((cx >= '0') && (cx <= '9')) {
- num = cx - '0';
- } else if ((cx >= 'A') && (cx <= 'Z')) {
- num = cx - 'A' + 10;
- } else {
- break;
- }
-
- res = (res * base) + num;
- }
- if (base == 31) {
+ const QString kBase35 = "0123456789ABCDEFGHJKMNPQRTVWXYZ"; // ILOSU are omitted.
+ if (str.startsWith("GC")) {
+ int base35 = str.size() > 6; // above GCFFFF?
+ QString s = str.mid(2);
+ while (!s.isEmpty()) {
+ res = res * 16 + kBase35.indexOf(s[0]);
+ s = str.mid(1);
+ }
+ if (base35) {
res -= 411120;
}
}
return ((hour * SECONDS_PER_HOUR) + (min * 60) + (int)sec);
}
+static time_t
+unicsv_parse_time(const QString& str, int* msec, time_t* date)
+{
+ return unicsv_parse_time(CSTR(str), msec, date);
+}
+
static status_type
-unicsv_parse_status(const char* str)
+unicsv_parse_status(const QString& str)
{
- if ((case_ignore_strcmp(str, "true") == 0) ||
- (case_ignore_strcmp(str, "yes") == 0) ||
- (*str == '1')) {
+ if (str.compare("true", Qt::CaseInsensitive) == 0 ||
+ str.compare("yes", Qt::CaseInsensitive) == 0 ||
+ str == "1") {
return status_true;
- } else if ((case_ignore_strcmp(str, "false") == 0) ||
- (case_ignore_strcmp(str, "no") == 0) ||
- (*str == '0')) {
+ }
+ if (str.compare("false", Qt::CaseInsensitive) == 0 ||
+ str.compare("no", Qt::CaseInsensitive) == 0 ||
+ str == "0") {
return status_false;
- } else {
- return status_unknown;
}
+return status_unknown;
}
static QDateTime
static void
-unicsv_fondle_header(const char* ibuf)
+unicsv_fondle_header(QString s)
{
// TODO: clean up this back and forth between QString and char*.
- QString s = QString(ibuf);
char* buf = NULL;
char* cbuf_start = NULL;
int column;
} else if (s.contains('|')) {
unicsv_fieldsep = "|";
}
- cbuf_start = xstrdup(CSTR(s.toLower()));
+ cbuf_start = xstrdup(s.toLower());
const char* cbuf = cbuf_start;
/* convert the header line into native ascii */
static void
unicsv_parse_one_line(char* ibuf)
{
- char* s;
Waypoint* wpt = NULL;
int column;
int utm_zone = -9999;
double swiss_easting = unicsv_unknown;
double swiss_northing = unicsv_unknown;
int checked = 0;
- time_t date = -1, time = -1;
+ time_t date = -1;
+ time_t time = -1;
int msec = -1;
char is_localtime = 0;
garmin_fs_t* gmsd;
memset(&ymd, 0, sizeof(ymd));
column = -1;
- while ((s = csv_lineparse(ibuf, unicsv_fieldsep, "\"", 0))) {
-
+ QString s;
+ while ((s = csv_lineparse(ibuf, unicsv_fieldsep, "\"", 0)), !s.isNull()) {
if (column > unicsv_fields_tab_ct) {
break; /* ignore extra fields on line */
}
column++;
checked++;
-
- s = lrtrim(s);
- if (! *s) {
+ s = s.trimmed();
+ if (s.isEmpty()) {
continue; /* skip empty columns */
}
switch (unicsv_fields_tab[column]) {
case fld_date:
case fld_datetime:
/* switch column type if it looks like an iso time string */
- if (strchr(s, 'T')) {
+ if (s.contains('T')) {
unicsv_fields_tab[column] = fld_iso_time;
}
break;
switch (unicsv_fields_tab[column]) {
case fld_latitude:
- human_to_dec(s, &wpt->latitude, &wpt->longitude, 1);
+ human_to_dec(CSTR(s), &wpt->latitude, &wpt->longitude, 1);
wpt->latitude = wpt->latitude * ns;
break;
case fld_longitude:
- human_to_dec(s, &wpt->latitude, &wpt->longitude, 2);
+ human_to_dec(CSTR(s), &wpt->latitude, &wpt->longitude, 2);
wpt->longitude = wpt->longitude * ew;
break;
break;
case fld_utm_zone:
- utm_zone = atoi(s);
+ utm_zone = s.toInt();
break;
case fld_utm_easting:
- utm_easting = atof(s);
+ utm_easting = s.toDouble();
break;
case fld_utm_northing:
- utm_northing = atof(s);
+ utm_northing = s.toDouble();
break;
case fld_utm_zone_char:
- utm_zc = toupper(s[0]);
+ utm_zc = s[0].toUpper().toLatin1();
break;
case fld_utm:
break;
case fld_bng_zone:
- strncpy(bng_zone, s, sizeof(bng_zone) -1);
+ strncpy(bng_zone, CSTR(s), sizeof(bng_zone) -1);
strupper(bng_zone);
break;
case fld_bng_northing:
- bng_northing = atof(s);
+ bng_northing = s.toDouble();
break;
case fld_bng_easting:
- bng_easting = atof(s);
+ bng_easting = s.toDouble();
break;
case fld_swiss:
break;
case fld_swiss_easting:
- swiss_easting = atof(s);
+ swiss_easting = s.toDouble();
break;
case fld_swiss_northing:
- swiss_northing = atof(s);
+ swiss_northing = s.toDouble();
break;
case fld_hdop:
- wpt->hdop = atof(s);
+ wpt->hdop = s.toDouble();
if (unicsv_detect) {
unicsv_data_type = trkdata;
}
break;
case fld_pdop:
- wpt->pdop = atof(s);
+ wpt->pdop = s.toDouble();
if (unicsv_detect) {
unicsv_data_type = trkdata;
}
break;
case fld_vdop:
- wpt->vdop = atof(s);
+ wpt->vdop = s.toDouble();
if (unicsv_detect) {
unicsv_data_type = trkdata;
}
break;
case fld_sat:
- wpt->sat = atoi(s);
+ wpt->sat = s.toInt();
if (unicsv_detect) {
unicsv_data_type = trkdata;
}
case fld_utc_date:
if ((is_localtime < 2) && (date < 0)) {
- date = unicsv_parse_date(s, NULL);
+ date = unicsv_parse_date(CSTR(s), NULL);
is_localtime = 0;
}
break;
case fld_utc_time:
if ((is_localtime < 2) && (time < 0)) {
- time = unicsv_parse_time(s, &msec, &date);
+ time = unicsv_parse_time(CSTR(s), &msec, &date);
is_localtime = 0;
}
break;
break;
case fld_course:
- WAYPT_SET(wpt, course, atof(s));
+ WAYPT_SET(wpt, course, s.toDouble());
if (unicsv_detect) {
unicsv_data_type = trkdata;
}
break;
case fld_temperature:
- d = atof(s);
+ d = s.toDouble();
if (fabs(d) < 999999) {
WAYPT_SET(wpt, temperature, d);
}
break;
case fld_temperature_f:
- d = atof(s);
+ d = s.toDouble();
if (fabs(d) < 999999) {
WAYPT_SET(wpt, temperature, FAHRENHEIT_TO_CELSIUS(d));
}
break;
case fld_heartrate:
- wpt->heartrate = atoi(s);
+ wpt->heartrate = s.toInt();
if (unicsv_detect) {
unicsv_data_type = trkdata;
}
break;
case fld_cadence:
- wpt->cadence = atoi(s);
+ wpt->cadence = s.toInt();
if (unicsv_detect) {
unicsv_data_type = trkdata;
}
break;
case fld_power:
- wpt->power = atof(s);
+ wpt->power = s.toDouble();
if (unicsv_detect) {
unicsv_data_type = trkdata;
}
case fld_time:
if ((is_localtime < 2) && (time < 0)) {
- time = unicsv_parse_time(s, &msec, &date);
+ time = unicsv_parse_time(CSTR(s), &msec, &date);
is_localtime = 1;
}
break;
case fld_date:
if ((is_localtime < 2) && (date < 0)) {
- date = unicsv_parse_date(s, NULL);
+ date = unicsv_parse_date(CSTR(s), NULL);
is_localtime = 1;
}
break;
case fld_year:
- ymd.tm_year = atoi(s);
+ ymd.tm_year = s.toInt();
break;
case fld_month:
- ymd.tm_mon = atoi(s);
+ ymd.tm_mon = s.toInt();
break;
case fld_day:
- ymd.tm_mday = atoi(s);
+ ymd.tm_mday = s.toInt();
break;
case fld_hour:
- ymd.tm_hour = atoi(s);
+ ymd.tm_hour = s.toInt();
break;
case fld_min:
- ymd.tm_min = atoi(s);
+ ymd.tm_min = s.toInt();
break;
case fld_sec:
- ymd.tm_sec = atoi(s);
+ ymd.tm_sec = s.toInt();
break;
case fld_datetime:
if ((is_localtime < 2) && (date < 0) && (time < 0)) {
- time = unicsv_parse_time(s, &msec, &date);
+ time = unicsv_parse_time(CSTR(s), &msec, &date);
is_localtime = 1;
}
break;
case fld_ns:
- ns = tolower(s[0]) == 'n' ? 1 : -1;
+ ns = s.startsWith('n', Qt::CaseInsensitive) ? 1 : -1;
wpt->latitude *= ns;
break;
case fld_ew:
- ew = tolower(s[0]) == 'e' ? 1 : -1;
+ ns = s.startsWith('e', Qt::CaseInsensitive) ? 1 : -1;
wpt->longitude *= ew;
break;
}
switch (unicsv_fields_tab[column]) {
case fld_garmin_city:
- GMSD_SETSTR(city, s);
+ GMSD_SETQSTR(city, s);
break;
case fld_garmin_postal_code:
- GMSD_SETSTR(postal_code, s);
+ GMSD_SETQSTR(postal_code, s);
break;
case fld_garmin_state:
- GMSD_SETSTR(state, s);
+ GMSD_SETQSTR(state, s);
break;
case fld_garmin_country:
- GMSD_SETSTR(country, s);
+ GMSD_SETQSTR(country, s);
break;
case fld_garmin_addr:
- GMSD_SETSTR(addr, s);
+ GMSD_SETQSTR(addr, s);
break;
case fld_garmin_phone_nr:
- GMSD_SETSTR(phone_nr, s);
+ GMSD_SETQSTR(phone_nr, s);
break;
case fld_garmin_phone_nr2:
- GMSD_SETSTR(phone_nr2, s);
+ GMSD_SETQSTR(phone_nr2, s);
break;
case fld_garmin_fax_nr:
- GMSD_SETSTR(fax_nr, s);
+ GMSD_SETQSTR(fax_nr, s);
break;
case fld_garmin_email:
- GMSD_SETSTR(email, s);
+ GMSD_SETQSTR(email, s);
break;
case fld_garmin_facility:
- GMSD_SETSTR(facility, s);
+ GMSD_SETQSTR(facility, s);
break;
default:
break;
switch (unicsv_fields_tab[column]) {
case fld_gc_id:
- gc_data->id = atoi(s);
+ gc_data->id = s.toInt();
if (gc_data->id == 0) {
gc_data->id = unicsv_parse_gc_id(s);
}
gc_data->container = gs_mkcont(s);
break;
case fld_gc_terr:
- gc_data->terr = atof(s) * 10;
+ gc_data->terr = s.toDouble() * 10;
break;
case fld_gc_diff:
- gc_data->diff = atof(s) * 10;
+ gc_data->diff = s.toDouble() * 10;
break;
case fld_gc_is_archived:
gc_data->is_archived = unicsv_parse_status(s);
gc_data->placer = s;
break;
case fld_gc_placer_id:
- gc_data->placer_id = atoi(s);
+ gc_data->placer_id = s.toInt();
break;
case fld_gc_hint:
gc_data->hint = s;